#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "user.h"
#include "flight.h"
#include "admin.h"

void user_menu(struct flight* flight, struct user* user);
void admin_menu(struct flight* flight, struct admin* admin, struct user* user);
int main()
{
first:  system("clear");
        printf("欢迎使用航班管理系统\n");
        printf("请选择操作:\n");
        printf("1.查看航班信息\n");
        printf("2.用户登录\n");
        printf("3.管理员登录\n");
        printf("4.注册用户\n");
        printf("5.退出系统\n");
        //头节点初始化
        struct flight* flight = flig_init();
        struct user* user = user_inite();
        struct admin* admin = admin_inite();

         // 从文件加载用户数据（如果文件存在）
        struct user* loaded_users = load_users_from_file("users.dat");
        if (loaded_users->next != NULL) {
            // 将加载的用户连接到主用户链表
            struct user* p = user;
            while(p->next != NULL) {
                p = p->next;
            }
            p->next = loaded_users->next;
            loaded_users->next = NULL;
        }
        free(loaded_users);
        
        // 从文件加载航班数据（如果文件存在）
        struct flight* loaded_flights = load_flights_from_file("flights.dat");
        if (loaded_flights->next != NULL) {
            // 将加载的航班连接到主航班链表
            struct flight* p = flight;
            while(p->next != NULL) {
                p = p->next;
            }
            p->next = loaded_flights->next;
            loaded_flights->next = NULL;
        }
        free(loaded_flights);
        
    while(1)
    {
        int choice;
        char flag;
        printf("请输入您的选择: ");
        scanf("%d", &choice);
        switch(choice)
        {
            case 1:system("clear");
                    show_flight(flight);
                    printf("输入q返回: ");
                    scanf(" %c", &flag);
                    if(flag == 'q' || flag == 'Q')
                    {
                        system("clear");
                        goto first;
                    }
                    break;
            case 2:system("clear");
                    system("clear");
                    printf("请输入用户名和密码: ");
                    char username[20], password[20];
                    scanf("%s %s", username, password);
                    if (user_login(user, username, password)) 
                    {
                        printf("登录成功！\n");
                        // 进入用户操作子菜单（后续实现）
                        user_menu(flight, user);
                    } else {
                        printf("用户名或密码错误！\n");
                    }
                    printf("输入任意键返回主菜单...");
                    getchar(); // 吸收缓冲区残留字符
                    getchar();
                    system("clear");
                    goto first;
                    break;
            case 3:
                    system("clear");
                    printf("请输入管理员账号和密码: ");
                    char adminname[20], adminpwd[20];
                    scanf("%s %s", adminname, adminpwd);
                    if (admin_login(admin, adminname, adminpwd)) { // 需在admin.h中声明
                        printf("管理员登录成功！\n");
                        admin_menu(flight, admin, user); // 管理员子菜单
                    } else {
                        printf("管理员账号或密码错误！\n");
                    }
                    printf("输入任意键返回主菜单...");
                    getchar();
                    getchar();
                    system("clear");
                    goto first;
                    break;
            case 4:
                     system("clear");
                    printf("---用户注册---\n");
                    char reg_user[20], reg_pwd[20];
                    printf("请输入新用户名: ");
                    scanf("%s", reg_user);
                    // 检查用户名是否已存在（需在user.h中实现校验函数）
                    if (user_exists(user, reg_user)) {
                        printf("用户名已存在！\n");
                    } else {
                        printf("请输入密码: ");
                        scanf("%s", reg_pwd);
                        // 新增用户（需在user.h中实现添加函数）
                        add_user(user, reg_user, reg_pwd);
                        // 立即将用户数据保存到文件
                        save_users_to_file(user, "users.dat");
                        printf("注册成功！\n");
                    }
                    printf("输入任意键返回主菜单...");
                    getchar();
                    getchar();
                    system("clear");
                    goto first;
                    break;         
            case 5:
                    system("clear");
                    printf("感谢使用，再见！\n");
                    // 保存数据到文件
                    save_users_to_file(user, "users.dat");
                    save_flights_to_file(flight, "flights.dat");
                    // 释放动态分配的内存（flight、user、admin）
                    free_flight(flight);
                    free_user(user);
                    free_admin(admin);
                    exit(0); // 退出程序
                    break; 

        }
    }
    return 0;
    
}

void user_menu(struct flight* flight, struct user* user) {
    int op;
    while (1) {
        system("clear");
        printf("---用户操作菜单---\n");
        printf("1. 查询航班\n");
        printf("2. 预订机票\n");
        printf("3. 取消预订\n");
        printf("4. 查看我的订单\n");
        printf("5. 返回主菜单\n");
        printf("请选择: ");
        scanf("%d", &op);
        switch (op) {
            case 1:
                query_flight(flight); // 按条件查询航班
                break;
            case 2:
                book_ticket(flight, user); // 订票功能
                break;
            case 3:
                cancel_booking(flight, user); // 取消预订功能
                break;
            case 4:
                view_my_bookings(user); // 查看我的订单
                break;
            case 5:
                return; // 返回主菜单
            default:
                printf("无效操作！\n");
        }
        printf("输入任意键继续...");
        getchar();
        getchar();
    }
}
// 更新函数声明


// 在 main 函数中调用时也需传入 user：
// admin_menu(flight, admin, user);  // 替换原来的 admin_menu(flight, admin);

// 修改 admin_menu 函数定义如下：
void admin_menu(struct flight* flight, struct admin* admin, struct user* user) {
    int op;
    while (1) {
        system("clear");
        printf("---管理员操作菜单---\n");
        printf("1. 添加航班\n");
        printf("2. 修改航班信息\n");
        printf("3. 删除航班\n");
        printf("4. 查看所有用户\n");
        printf("5. 添加用户到黑名单\n");
        printf("6. 添加用户到白名单\n");
        printf("7. 删除用户\n");
        printf("8. 返回主菜单\n");
        printf("请选择: ");
        scanf("%d", &op);
        switch (op) {
            case 1:
                add_flight(flight); // 添加新航班
                break;
            case 2:
                modify_flight(flight); // 修改航班
                break;
            case 3:
                {
                    char flight_id[20];
                    printf("请输入要删除的航班号: ");
                    scanf("%s", flight_id);
                    int result = delete_flight(flight_id, flight); // 删除航班
                    if (result == 0) {
                        // 删除成功，保存到文件
                        save_flights_to_file(flight, "flights.dat");
                        printf("航班信息已更新到文件\n");
                    }
                    break;
                }
            case 4:system("clear");
                show_all_users(user); // 正确传入 user
                break;
            case 5:
                {   system("clear");
                    char username[20];
                    printf("请输入要拉黑的用户名: ");
                    scanf("%s", username);
                    add_blacklist(user, username);
                    // 保存用户信息到文件
                    save_users_to_file(user, "users.dat");
                    break;
                }
            case 6:
                {
                    char username[20];
                    printf("请输入要添加到白名单的用户名: ");
                    scanf("%s", username);
                    add_whilelist(user, username);
                    // 保存用户信息到文件
                    save_users_to_file(user, "users.dat");
                    break;
                }
            case 7:
                {   system("clear");
                    char username[20];
                    printf("请输入要删除的用户名: ");
                    scanf("%s", username);
                    delete_user(user, username);
                    // 保存用户信息到文件
                    save_users_to_file(user, "users.dat");
                    break;
                }    
            case 8:
                return;
            default:
                printf("无效操作！\n");
        }
        printf("输入任意键继续...");
        getchar();
        getchar();
    }
}